package br.fatec.model.bll;

import java.util.List;

import br.fatec.model.dao.EstoqueDao;
import br.fatec.model.entity.Estoque;
import br.fatec.model.entity.MateriaPrima;
import br.fatec.util.Validacoes;

public class EstoqueBll {
	private EstoqueDao estoqueDao;
	
	public EstoqueBll()
	{
		estoqueDao = new EstoqueDao();
	}
	
	public void cadastrar(Estoque estoque) throws Exception
	{	
		estoqueDao.cadastrar(estoque);	
	}
	
	public void alterar(Estoque estoque) throws Exception
	{			
		estoqueDao.alterar(estoque);
	}
	
	public void excluir(Estoque estoque) throws Exception
	{
		try {
		estoqueDao.excluir(estoque);
		} catch (Exception ex) {
			if (Validacoes.validarExceptionChaveEstrangeira(ex)) {
				estoqueDao.desativar(estoque);
			}
			else
				throw ex;
		}
	}
	
	public Estoque consultar(Integer codigo) throws Exception
	{	
		return estoqueDao.consultar(codigo);
	}

	public List<Estoque> listar() throws Exception
	{
		return estoqueDao.listar();
	}

	public List<Estoque> listar(String item) throws Exception {
		return estoqueDao.listar(item);
	}
	
	public List<Estoque> filtrar(String codigo, String codigoItem, String nome,
			String tipo, String quantidade, MateriaPrima.UnidadeMedida unidadeMedida) throws Exception {
		return estoqueDao.filtrar(codigo, codigoItem, nome, tipo, quantidade, unidadeMedida);
	}
	
	public boolean verificarEstoque(Estoque estoque, Double quantidade) throws Exception
	{
		estoque = consultar(estoque.getCodigo());
		
		if(estoque.getQuantidadeAtual() >= quantidade)
			return true;
		
		return false;
	}

	public void adicionarEstoque(Estoque estoque, Double quantidade)
			throws Exception {

		estoque = consultar(estoque.getCodigo());
		
		Double quantidadeAtual = estoque.getQuantidadeAtual() + quantidade;
		estoque.setQuantidadeAtual(quantidadeAtual);
		alterar(estoque);
	}

	public boolean reduzirEstoque(Estoque estoque, Double quantidade) throws Exception 
	{
		estoque = consultar(estoque.getCodigo());

		if(verificarEstoque(estoque, quantidade))
		{
			Double quantidadeAtual = estoque.getQuantidadeAtual() - quantidade;
			estoque.setQuantidadeAtual(quantidadeAtual);
	
			alterar(estoque);
			
			return true;
		}
		
		return false;
	}
}
